package cn.lee.cplibrary.util.video;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.os.Build;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

import java.util.List;

import cn.lee.cplibrary.R;
import cn.lee.cplibrary.init.CPInitializer;
import cn.lee.cplibrary.util.ObjectUtils;
import cn.lee.cplibrary.widget.dialog.CpComDialog;

/**
 * 获取拍摄短视频或者相册中的视频，外部使用需要请求权限即配合PermissionX使用
 */
public class CpVideoXDialog {
    public static boolean useSystemCamera = true;//调用相机拍照时候：是否只使用系统相机，不能调其虚拟相机、美颜相机等
    private Activity activity;
    public static final int REQUEST_CODE_FOR_RECORD = 5230;//绘制相机：录制视频请求码
    public static final int REQUEST_CODE_FOR_COMPRESS = 5231;//压缩视频请求码
    public static final int REQUEST_FOR_VIDEO_FILE = 5232;//选择文件中视频请求吗
    public static final int REQUEST_CODE_FOR_CAMERA = 5233;//系统相机：选择文件中视频请求吗
    private int duration = -1;//录制视频的时长，-1表示不限制时长 ，单位ms（绘制相机，系统相机）
    private int quality = VideoRecordActivity.Q1080;//系统相机和绘制相机：录制视频的分辨率
    private boolean isSysCamera = true;//录制视频是否使用系统相机
    //系统相机设置
    private long sys_max_size_limit = 1024L * 1024 * 100;// 系统相机：允许的最大大小(以 B 为单位)  例如：限制大小为100M

    //绘制相机,相册,系统相机
    public enum VideoVersion {
        record, album, camera
    }

    public CpVideoXDialog(Activity activity) {
        this.activity = activity;
        CPInitializer.checkInitialization();
    }

    /**
     * 注意：打开上传图片Dialog的Activity
     */
    public Dialog showChooseDialog() {
        View view = LayoutInflater.from(activity).inflate(R.layout.cp_dialog_pic_choose, null);
        final Dialog picDialog = CpComDialog.getBottomDialog(activity, true, view);
        if (picDialog == null) {
            return null;
        }
        TextView btnAlbum = view.findViewById(R.id.photoAlbum);
        TextView btnRecord = view.findViewById(R.id.photograph);
        btnAlbum.setText("打开相册");
        btnRecord.setText("拍摄视频");
        //相册
        btnAlbum.setOnClickListener(arg0 -> {
            picDialog.dismiss();
            start(activity, VideoVersion.album);
        });
        //拍摄
        btnRecord.setOnClickListener(arg0 -> {
            picDialog.dismiss();
            if (isSysCamera) {
                start(activity, VideoVersion.camera);
            } else {
                start(activity, VideoVersion.record);
            }
        });

        view.findViewById(R.id.cancel)
                .setOnClickListener(v -> picDialog.dismiss());
        return picDialog;
    }

    /**
     * 录制/访问相册视频开始
     *
     * @param ver 功能类型
     */
    public void start(final Activity activity, final VideoVersion ver) {
        switch (ver) {
            case record:
                openRecord(activity);
                break;
            case camera:
                openCamera(activity);
                break;
            case album:
                openVideoFile(activity);
                break;
        }
    }

    /**
     * 进入自定义相机绘制页面：录制视频
     */
    protected void openRecord(Activity activity) {
        //VideoRecordActivity.startActivityForResult(activity, REQUEST_CODE_FOR_RECORD, quality);
        VideoRecordActivity.startActivityForResult(activity, REQUEST_CODE_FOR_RECORD, quality, duration);
    }

    /**
     * 选择文件视频
     */
    protected void openVideoFile(Activity activity) {
        /* 开启Pictures画面Type设定为image */
        //intent.setType("video/*;image/*");
        //intent.setType("audio/*"); //选择音频
        //方式1：打开包含视频的文件件：包含最近下载等
//        Intent intent = new Intent();
//        intent.setType("video/*"); //选择视频 （mp4 3gp 是android支持的视频格式）
//        intent.setAction(Intent.ACTION_GET_CONTENT);
//        activity.startActivityForResult(intent, REQUEST_FOR_VIDEO_FILE);
        //方式2：打开视频图库
        Intent intent = new Intent();
        intent.setType("video/*"); //选择视频 （mp4 3gp 是android支持的视频格式）
        intent.setAction(Intent.ACTION_PICK);
        activity.startActivityForResult(intent, REQUEST_FOR_VIDEO_FILE);
    }

    /**
     * 打开系统相机：录制视频
     */
    protected void openCamera(Activity activity) {
//        String camera_video_output_path = CpVideoUtil.getOutputMediaFile(activity);//视频存储地址：不能使用文件，应该是文件夹（即父文件夹）
//        File videoFile = new File(camera_video_output_path);//视频存储地址
//        if (videoFile.exists()) {
//            videoFile.delete();
//        }
//        videoFile.mkdir();
        //生成URI，给MediaStore.EXTRA_OUTPUT使用----注释吧 用不到啦
//        File videoFile = new File(CpVideoUtil.getAlbumStorageDir(), "temp_video");
//        if (!videoFile.exists()) {
//            videoFile.mkdir();
//        }
//        Uri camera_URI;
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//FileProvider只能用于高版本的app中
//            camera_URI = FileProvider.getUriForFile(activity, AppUtils.getAppId(activity) + ".provider", videoFile);
//        } else {
//            camera_URI = Uri.fromFile(videoFile);
//        }
        //Intent设置相机参数
        Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        onlyUseSysCamera(intent, activity);//设置只使用系统相机
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//FileProvider只能用于高版本的app中
            intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//写入权限。
        }
        //储存地址EXTRA_OUTPUT：---此处注释掉 有BUG
        // 1、华为鸿蒙系统设置此参数则录视频结束后无法保存视频，功能无法使用
        // 2、高版本安卓系统，录视频结束后，不会保存到指定路径，均会保存到storage/emulated/0/DCIM/Camera/...mp4（鸿蒙除外 因为报错压根不保存视频） 即设置此参数无用
        // 3、测试的手机有 鸿蒙4.0.0-android12、小米13、vivo12、小米12、三星 A52
//        intent.putExtra(MediaStore.EXTRA_OUTPUT, camera_URI);
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, quality);   //用于控制录制视频的质量；0——低质量；1——高质量
        if (duration > 1 * 1000) {//大于1s才设置最大时长，否则不限时长
            //允许记录的最长时间(以 秒 为单位)  例如：限制为60S
            intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, duration / 1000);
        }
        intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, sys_max_size_limit); //允许的最大大小(以 B 为单位)  例如：限制大小为100M
//        intent.putExtra("android.intent.extras.CAMERA_FACING", 1);//设置前置摄像头
        activity.startActivityForResult(intent, REQUEST_CODE_FOR_CAMERA);//打开摄像头
    }

    /**
     * 跳转到压缩页面 压缩
     *
     * @param activity
     * @param inputPath
     */
    public void compressVideo(Activity activity, String inputPath) {
        if (!ObjectUtils.isEmpty(inputPath)) {
            VideoCompressActivity.startActivityForResult(activity, REQUEST_CODE_FOR_COMPRESS, inputPath);
        }
    }

    /**
     * 跳转到压缩页面 压缩
     *
     * @param activity
     * @param inputPath
     * @param quality   :值为 VideoController.COMPRESS_QUALITY_HIGH,
     *                  VideoController.COMPRESS_QUALITY_MEDIUM，
     *                  VideoController.COMPRESS_QUALITY_LOW
     */
    public void compressVideo(Activity activity, String inputPath, int quality) {
        if (!ObjectUtils.isEmpty(inputPath)) {
            VideoCompressActivity.startActivityForResult(activity, REQUEST_CODE_FOR_COMPRESS, inputPath, quality);
        }
    }

    /**
     * 设置录制视频的时长，-1表示不限制时长 ，单位 ms
     * eg：15s 则传入15*1000
     */
    public void setDuration(int duration) {
        this.duration = duration;
    }

    /**
     * 1、绘制相机： quality 拍摄视频的质量，
     * 值为VideoRecordActivity.Q480，Q720，Q1080，Q21600,质量越高，画质越清晰，文件越大
     * 2、系统相机 CamcorderProfile.QUALITY_HIGH1——高质量，  QUALITY_LOW0——低质量；
     */
    public void setQuality(int quality) {
        this.quality = quality;
    }

    /**
     * 录制视频是否使用系统相机,true 使用系统相机，false 使用绘制相机
     */
    public void setSysCamera(boolean sysCamera) {
        isSysCamera = sysCamera;
    }

    /**
     * 系统相机：允许的最大大小(以 B 为单位)
     * 例如：限制大小为100M 则设置1024L * 1024 * 100
     */
    public void setSys_max_size_limit(long sys_max_size_limit) {
        this.sys_max_size_limit = sys_max_size_limit;
    }

    public boolean isUseSystemCamera() {
        return useSystemCamera;
    }

    public void setUseSystemCamera(boolean useSystemCamera) {
        CpVideoXDialog.useSystemCamera = useSystemCamera;
    }

    /**
     * 打开相机时，如果满足以下2个条件，则只打开系统相机
     * （1） UseSystemCamera=true，
     * （2）获取手机系统相机包名成功
     * 只打开系统相机做法：将包名设置给打开相机的Intent
     *
     * @param intent 打开相机的 Intent
     */
    public void onlyUseSysCamera(Intent intent, Context activity) {
        if (!isUseSystemCamera()) {
            return;
        }
        try { //尽可能调用系统相机
            String cameraPackageName = getCameraPhoneAppInfos(activity);
            if (cameraPackageName == null) {
                cameraPackageName = "com.android.camera";
            }
            final Intent intent_camera = activity.getPackageManager()
                    .getLaunchIntentForPackage(cameraPackageName);

            if (intent_camera != null) {
                intent.setPackage(cameraPackageName);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 对使用系统拍照的处理
    public String getCameraPhoneAppInfos(Context context) {
        try {
            String strCamera = "";
            List<PackageInfo> packages = context.getPackageManager()
                    .getInstalledPackages(0);
            for (int i = 0; i < packages.size(); i++) {
                try {
                    PackageInfo packageInfo = packages.get(i);
                    String strLabel = packageInfo.applicationInfo.loadLabel(
                            context.getPackageManager()).toString();
                    // 一般手机系统中拍照软件的名字 可能尚未找全 需要持续添加适配
                    if ("相机,照相机,照相,拍照,摄像,Camera,camera".contains(strLabel)) {
                        strCamera = packageInfo.packageName;
                        if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                            break;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (strCamera != null) {
                return strCamera;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}



